#ifndef __INT_24C256_H
#define __INT_24C256_H

#include "Dri_IIC.h"
#include "Com_Delay.h"
#include "Com_Debug.h"

#define EEPROM_ADDR 0x50

#define DATA_STORAGE_START 0x0000 // 数据存储起始地址
#define DATA_STORAGE_SIZE 1024    // 数据存储区域大小（64×16字节）
#define POINTER_ADDRESS 0x0400    // 指针存储地址
#define RECORD_SIZE 16            // 每条记录大小
#define MAX_RECORDS 64            // 最大记录数（从16改为64）
#define FLOAT_SCALE 100           // 浮点数缩放倍数（保留2位小数）

// 数据结构（整数存储浮点数）
typedef struct
{
    int32_t circle_count;     // 圈数
    int32_t part_int;         // 不足一圈的部分×100 (保留2位小数)
    int32_t displacement_int; // 位移×100 (保留2位小数)
    uint32_t checksum;        // 校验和
} DataRecord_t;

/**
 * @brief 保存数据
 * 
 * @param circle 
 * @param angle 
 * @param displacement 
 * @return uint8_t 
 */
uint8_t Int_24C256_SaveData(int32_t circle, float part_int, float displacement);

/**
 * @brief 读取数据
 * 
 * @param circle 
 * @param angle 
 * @param displacement 
 * @return uint8_t 
 */
uint8_t Int_24C256_LoadLatestData(int32_t *circle, float *part_int, float *displacement);

/**
 * @brief 校验数据
 * 
 * @param record 
 * @return uint32_t 
 */
uint32_t Calculate_Checksum(DataRecord_t *record);

/**
 * @brief 初始化存储系统
 * 
 */
void Int_24C256_Storage_Init(void);

void Int_24C256_Init(void);

void Int_24C256_WriteByte(uint16_t Addr, uint8_t Data);

uint8_t Int_24C256_ReadByte(uint16_t Addr);

/**
 * @brief  向 AT24C256 指定地址写入一页数据（最多64字节）
 * @param  Addr: 存储地址 (0x0000 ~ 0x7FFF)
 * @param  data: 要写入的数据指针
 * @param  len: 数据长度（最大64字节）
 */
void Int_24C256_WritePage(uint16_t Addr, uint8_t *data, uint16_t len);

/**
 * @brief  向 AT24C256 指定地址写入多个字节（自动处理跨页）
 * @param  Addr: 存储地址 (0x0000 ~ 0x7FFF)
 * @param  data: 要写入的数据指针
 * @param  len: 数据长度
 */
void Int_24C256_WriteData(uint16_t Addr, uint8_t *data, uint16_t len);

/**
 * @brief  从 AT24C256 指定地址读取多个字节
 * @param  Addr: 存储地址 (0x0000 ~ 0x7FFF)
 * @param  buffer: 用于存储读取数据的缓冲区
 * @param  len: 要读取的数据长度
 */
void Int_24C256_ReadData(uint16_t Addr, uint8_t *buffer, uint16_t len);

#endif
